package entity;

import java.io.File;
import tools.WriteLog;

/**
 * 自定义运行时异常. 
 * 部分构造器内调用writeAsyn() 写日志。
 * @author Rex
 *
 */
public class DefinedRuntimeException extends RuntimeException {
	private static final long serialVersionUID = 20190513L;
	
	/**
	 * 异常对象生成时间.
	 */
	private final long occurrenceTime = System.currentTimeMillis();
	
	/**
	 * 写日志操作对象常量.
	 */
	private static final WriteLog WL;
	
	// 初始化常量
	static {
		if (System.getProperty("os.name").toLowerCase().contains("windows")) {
			// Windows
			File file = new File("C:\\temp");
			if (file.exists() == false) {
				file.mkdir();
			}
			WL = new WriteLog("C:\\temp\\RenameToolError.log");
		} else {
			// Linux/Unix
			WL = new WriteLog("/usr/RenameToolError.log");
		}
	}

	public long getOccurrenceTime() {
		return occurrenceTime;
	}

	public DefinedRuntimeException() {
		this("DefinedRuntimeException无参构造器");
	}

	public DefinedRuntimeException(String message) {
		super(message);
		// 将错误信息写出到日志.
		WL.writeAsyn(this);
	}
	
	/**
	 * 使用此构造器初始化的异常对象不写日志.
	 * 	@param flag 无实际作用，任何布尔值均可，仅用于与其它构造器区分
	 * @param message 异常信息
	 */
	public DefinedRuntimeException(boolean flag, String message) {
		super(message);
	}

	public DefinedRuntimeException(Throwable cause) {
		super(cause);
		// 将错误信息写出到日志.
		WL.writeAsyn(this);
	}

	public DefinedRuntimeException(String message, Throwable cause) {
		super(message, cause);
		// 将错误信息写出到日志.
		WL.writeAsyn(this);
	}
	
	/**
	 * 使用此构造器初始化的异常对象不写日志.
	 * @param flag 无实际作用，任何布尔值均可，仅用于与其它构造器区分
	 * @param message
	 * @param cause
	 */
	public DefinedRuntimeException(boolean flag, String message, Throwable cause) {
		super(message, cause);
	}

	public DefinedRuntimeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
		// 将错误信息写出到日志.
		WL.writeAsyn(this);
	}
	
}